﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;

using System.IO;
using System.Text;

using System.IO.Compression;

public partial class Arquivos : System.Web.UI.Page
{
    ConexaoMDBD Command = new ConexaoMDBD();
    PopulaDropDownList PopulaDDL = new PopulaDropDownList();
    GeraArquivo GArquivo = new GeraArquivo();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (HttpContext.Current.User.Identity.Name.ToString() != "CORPORATE\\p-mlazaro")
            {
                Response.Redirect("Default.aspx");
            }
            else
            {
                Popula_ddl_cod_ambi();
                Popula_ddl_cod_sist();
            }
        }
    }

    protected void Popula_ddl_cod_ambi()
    {
        PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_AMBI", ddl_cod_ambi, "COD_AMBI", "DESC_AMBI", null);
    }

    protected void Popula_ddl_cod_sist()
    {
        PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_SIST", ddl_cod_sist, "COD_SIST", "NOME_MODELO", null);
    }

    protected void ddl_cod_ambi_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddl_cod_ambi.SelectedValue != "0")
        {
            PopulaDDL.dsResultado("PACK_APP_POPULA_DDL.PROC_APP_POPULA_DDL_COD_USRE", ddl_cod_usre, "COD_SCHM", "NOME_USER", ddl_cod_ambi.SelectedValue.ToString());
            ddl_cod_usre.SelectedValue = "0";
        }
        else
        {
            ddl_cod_usre.DataSource = null;
            ddl_cod_usre.DataBind();
        }
    }

    protected void btn_arquivo_iv_Command(object sender, CommandEventArgs e)
    {
        lbl_resultado.Text = "";

        String Ambiente = ddl_cod_ambi.SelectedValue == "0" ? null : ddl_cod_ambi.SelectedItem.ToString();
        String Sistema = ddl_cod_sist.SelectedValue == "0" ? null : ddl_cod_sist.SelectedItem.ToString();
        String Usuario = ddl_cod_usre.SelectedValue == "0" ? null : ddl_cod_usre.SelectedItem.ToString();

        String NomeDiretorio = GArquivo.NomeDiretorio("IV", null);
        
        String NomeArquivo = Sistema == null ? NomeDiretorio + "\\" + "SinaSetup - Todos os modulos" + ".txt" : NomeDiretorio + "\\" + "SinaSetup - " + Sistema + ".txt";

        FileInfo SinaSetup = new FileInfo(NomeArquivo);

        if (SinaSetup.Exists)
        {
            SinaSetup.Delete();
        }

        StreamWriter Arquivo = new StreamWriter(NomeArquivo, true);//, Encoding.ASCII);

        //Arquivo.WriteLine("-- OBS. 1 : SÃO UTILIZADOS OS USUÁRIOS/SCHEMAS 'SINABASE' E 'SINAMAIS'");
        //Arquivo.WriteLine("-- OBS. 2 : OS OBJETOS ESTÃO COM A ESPECIFICAÇÃO DO USUÁRIO/SCHEMA 'SINABASE'");
        //Arquivo.WriteLine("-- OBS. 3 : TAMBÉM SÃO CRIADOS OS OBJETOS DO USUÁRIO/SCHEMA 'SINAMAIS'");
        Arquivo.WriteLine("-- OBS. 1 : OS OBJETOS SÃO CRIADOS NA SEGUINTE ORDEM:");
        Arquivo.WriteLine("--           01 : TABELAS");
        Arquivo.WriteLine("--           02 : CONSTRAINTS");
        Arquivo.WriteLine("--           03 : PRIMARY KEYS");
        Arquivo.WriteLine("--           04 : UNIQUE CONSTRAINTS");
        Arquivo.WriteLine("--           05 : ÍNDICES");
        Arquivo.WriteLine("--           06 : FOREIGN KEYS");
        Arquivo.WriteLine();
        Arquivo.WriteLine("-- 01 : TABELAS");

        DataSet dsResultadoTabela = GArquivo.dsResultado("TABELAS", "PACK_APP_SETUP.PROC_APP_SETUP_TABELA", Ambiente, Sistema, Usuario, null);
        
        foreach (DataRow drResultadoTabela in dsResultadoTabela.Tables[0].Rows)
        {
            String[] NovaLinha = drResultadoTabela[1].ToString().Split(new Char[] { '\n' });

            foreach (String Texto in NovaLinha)
            {
                Arquivo.WriteLine(Texto);
            }

            Arquivo.WriteLine();
        }

        lbl_resultado.Text = string.Format("{0:N0}", Int32.Parse(dsResultadoTabela.Tables[0].Rows.Count.ToString()));

        Arquivo.WriteLine("-- 02 : CONSTRAINTS");

        DataSet dsResultadoConstraint = GArquivo.dsResultado("CONSTRAINTS", "PACK_APP_SETUP.PROC_APP_SETUP_CONSTRAINT", Ambiente, Sistema, Usuario, null);
        
        foreach (DataRow drResultadoConstraint in dsResultadoConstraint.Tables[0].Rows)
        {
            Arquivo.WriteLine(drResultadoConstraint[2].ToString());
            Arquivo.WriteLine();
        }

        Arquivo.WriteLine("-- 03 : PRIMARY KEYS");

        DataSet dsResultadoPrimaryKey = GArquivo.dsResultado("PRIMARY KEYS", "PACK_APP_SETUP.PROC_APP_SETUP_PK", Ambiente, Sistema, Usuario, null);

        foreach (DataRow drResultadoPrimaryKey in dsResultadoPrimaryKey.Tables[0].Rows)
        {
            String[] NovaLinha = drResultadoPrimaryKey[2].ToString().Split(new Char[] { '\n' });

            foreach (String Texto in NovaLinha)
            {
                Arquivo.WriteLine(Texto);
            }

            Arquivo.WriteLine();
        }

        Arquivo.WriteLine("-- 04 : UNIQUE CONSTRAINTS");

        DataSet dsResultadoUnique = GArquivo.dsResultado("UNIQUE CONSTRAINTS", "PACK_APP_SETUP.PROC_APP_SETUP_UNIQUE", Ambiente, Sistema, Usuario, null);
        
        foreach (DataRow drResultadoUnique in dsResultadoUnique.Tables[0].Rows)
        {
            Arquivo.WriteLine(drResultadoUnique[2].ToString());
            Arquivo.WriteLine();
        }

        Arquivo.WriteLine("-- 05 : ÍNDICES");

        DataSet dsResultadoIndice = GArquivo.dsResultado("ÍNDICES", "PACK_APP_SETUP.PROC_APP_SETUP_INDICE", Ambiente, Sistema, Usuario, null);
        
        foreach (DataRow drResultadoIndice in dsResultadoIndice.Tables[0].Rows)
        {
            Arquivo.WriteLine(drResultadoIndice[2].ToString());
            Arquivo.WriteLine();
        }

        Arquivo.WriteLine("-- 06 : FOREIGN KEYS");

        DataSet dsResultadoForeignKey = GArquivo.dsResultado("FOREIGN KEYS", "PACK_APP_SETUP.PROC_APP_SETUP_FK", Ambiente, Sistema, Usuario, null);
        
        foreach (DataRow drResultadoForeignKey in dsResultadoForeignKey.Tables[0].Rows)
        {
            String[] NovaLinha = drResultadoForeignKey[2].ToString().Split(new Char[] { '\n' });

            foreach (String Texto in NovaLinha)
            {
                Arquivo.WriteLine(Texto);
            }

            Arquivo.WriteLine();
        }

        Arquivo.Close();

        FileInfo fInfo = new FileInfo(NomeArquivo);
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fInfo.Name + "\"");
        HttpContext.Current.Response.AddHeader("Content-Length", fInfo.Length.ToString());
        HttpContext.Current.Response.WriteFile(fInfo.FullName);
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.Close();
        fInfo = null;

        Directory.Delete(NomeDiretorio, true);

        lbl_resultado.Text = "Arquivo criado com sucesso com " + lbl_resultado.Text + " tabelas.";
    }

    protected void btn_arquivo_team_system_Command(object sender, CommandEventArgs e)
    {
        String Ambiente = ddl_cod_ambi.SelectedValue == "0" ? null : ddl_cod_ambi.SelectedItem.ToString();
        String Sistema = ddl_cod_sist.SelectedValue == "0" ? null : ddl_cod_sist.SelectedItem.ToString();
        String Usuario = ddl_cod_usre.SelectedValue == "0" ? null : ddl_cod_usre.SelectedItem.ToString();
        String TeamProject;
        String NomeDiretorio;
        String NomeArquivo;
        DataSet dsResultado;

        DataSet dsResultadoTeamProject = GArquivo.dsResultado(null, "PACK_APP_SETUP.PROC_APP_SETUP_TEAM_SYSTEM", Ambiente, Sistema, Usuario, null);

        foreach (DataRow drResultadoTeamProject in dsResultadoTeamProject.Tables[0].Rows)
        {
            TeamProject = drResultadoTeamProject[0].ToString();

            // TABELAS
            NomeDiretorio = GArquivo.NomeDiretorio("TABELAS", TeamProject);
            dsResultado = GArquivo.dsResultado("TABELAS", "PACK_APP_SETUP.PROC_APP_SETUP_TABELA", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 0, 1);

            // CONSTRAINTS
            NomeDiretorio = GArquivo.NomeDiretorio("CONSTRAINTS", TeamProject);
            dsResultado = GArquivo.dsResultado("CONSTRAINTS", "PACK_APP_SETUP.PROC_APP_SETUP_CONSTRAINT", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 1, 2);

            dsResultado = GArquivo.dsResultado("CONSTRAINTS", "PACK_APP_SETUP.PROC_APP_SETUP_UNIQUE", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 1, 2);

            dsResultado = GArquivo.dsResultado("CONSTRAINTS", "PACK_APP_SETUP.PROC_APP_SETUP_PK", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 1, 2);

            // ÍNDICES
            NomeDiretorio = GArquivo.NomeDiretorio("ÍNDICES", TeamProject);
            dsResultado = GArquivo.dsResultado("ÍNDICES", "PACK_APP_SETUP.PROC_APP_SETUP_INDICE", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 1, 2);

            // FOREIGN KEYS
            NomeDiretorio = GArquivo.NomeDiretorio("FOREIGN KEYS", TeamProject);
            dsResultado = GArquivo.dsResultado("FOREIGN KEYS", "PACK_APP_SETUP.PROC_APP_SETUP_FK", Ambiente, null, Usuario, TeamProject);
            NomeArquivo = GArquivo.GravaArquivo(NomeDiretorio, dsResultado, 1, 2);
        }

        lbl_resultado.Text = ddl_cod_sist.SelectedValue == "0" ? "Criados arquivos para todos os módulos" : "Criados arquivos para o módulo " + ddl_cod_sist.SelectedItem.Text;
    }
}
